using System;
using System.Windows.Forms;
using App.Git.Vista.Widgets;
using App.Modelo.Attributes;
using App.Modelo.Menu;
using App.Persistencia;
using App.Seguridad.Vista.Menu;
using App.SolInf.Modelo;
using App.SolInf.Controlador;
using App.SolInf.Vista.Controls;

namespace App.SolInf.Vista.Listado
{
    [Formulario("Productos", "Gestion/Busqueda de productos")]
    public partial class ListadoProducto : ListadoBusquedaGenerico
    {
        public FiltroBusquedaProducto ControlBusqueda;
        public Repositorio Repositorio;


        private ControladoraProductos _controladoraProductos;
        public ControladoraProductos ControladoraProductos
        {
            get
            {
                return _controladoraProductos ??
                       (_controladoraProductos =
                        ModuloSolInf.Instance.FabricaControladoras.Factory<ControladoraProductos>());
            }
            set
            {
                _controladoraProductos = value;
            }
        }
        
			
        public ListadoProducto()
        {
            Repositorio = new Repositorio();
            ContenedorModulo = ModuloSolInf.Instance;

            FormatoColumna(AddColumn("Id"), ListadoFormatoCell.Id);
            AddColumn("Categoria");
            AddColumn("Descripcion");
            AddColumn("Marca");
            FormatoColumna(AddColumn("Precio"), ListadoFormatoCell.Moneda );
            FormatoColumna(AddColumn("Stock"), ListadoFormatoCell.Numero);

            EstablecerAnchos(70, 70, 300, 70, 70, 70);

            ControlBusqueda = new FiltroBusquedaProducto()
                                  {
                                      Marcas = Repositorio.GetAll<Marca>(),
                                      Categorias = Repositorio.GetAll<CategoriaProducto>()
                                  };

            SearchControls.Add(ControlBusqueda);

            var controladorBoton = new MenuControladoraBotonera {
                    Controls = ControlesGestion,
                    Model = new MenuContenedor(new MenuBaseItem[] {
                        new MenuBoton("Nuevo", "add", "Productos/alta"),
                        new MenuBoton("Ver", "view", "Productos/ver"),
                        new MenuBoton("Modificar", "edit", "Productos/modificar"),
                        new MenuBoton("Eliminar", "delete", "Productos/baja")
                    })
                };

            controladorBoton.ExecuteCommand += new EventHandler<MenuEjecutarComandoEventArgs>(controladorBoton_ExecuteCommand);
        }

        void controladorBoton_ExecuteCommand(object sender, MenuEjecutarComandoEventArgs e)
        {
            if (e.Item.Command == "Productos/alta")
            {
                new Comandos.ComandoAltaProducto().Ejecutar();
            }
            else if (e.Item.Command == "Productos/ver" && _seleccionar())
            {
                new DetalleProducto
                    {
                        Producto = (Producto) ItemSeleccionado
                    }.Ver();
            }
            else if (e.Item.Command == "Productos/modificar" && _seleccionar())
            {
                new DetalleProducto
                    {
                        Producto = (Producto) ItemSeleccionado
                    }.Modificar();
            }
            else if (e.Item.Command == "Productos/baja" && _confirmar())
            {
                try
                {
                    ControladoraProductos.Baja((Producto)ItemSeleccionado);
                    MessageBox.Show("Se elimino el item", Text);
                    OnSearch();
                }
                catch (Exception ex)
                {              
                    MessageBox.Show(ex.Message, Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }

                
            }
        }

        protected override void OnSearch()
        {
            DataSource = ControlBusqueda.AplicarFiltro(Repositorio.CreateCriteria<Producto>()).List();
        }

        [Comando("modificar", "Modifica un producto existente en la base de datos")]
        public void Modificar()
        {
            ContenedorModulo.AbrirFormulario(this);
        }


        [Comando("ver")]
        public void Ver()
        {
            ContenedorModulo.AbrirFormulario(this);
        }


        [Comando("baja")]
        public void Baja()
        {
            ContenedorModulo.AbrirFormulario(this);
        }
    }
}